<h2>DESCRIPTION</h2>

<em>r.thin</em> scans the named <em>input</em> raster map layer and 
thins non-NULL cells that denote linear features into linear features 
having a single cell width. Raster lines often need to be thinned 
(skeletonizing raster features) to a single pixel width before they can 
be transformed to vector data.

<p>
<em>r.thin</em> will thin only the non-NULL (no data) raster cells
of the named <em>input</em> raster map layer within the current
geographic region settings.  The cell width of the thinned
<em>output</em> raster map layer will be equal to the cell
resolution of the currently set geographic region.  All of
the thinned linear features will have the width of a single
cell.

<p>
<em>r.thin</em> will create a new <em>output</em> raster
data file containing the thinned linear features.
<em>r.thin</em> assumes that linear features are encoded
with positive values on a background of NULL's in the
<em>input</em> raster data file, hence it creates a NULL/1
output map.

<h2>NOTES</h2>

<em>r.thin</em> only creates raster map layers. In order to
create a vector map, the user will need to run 
<em><a href="r.to.vect.html">r.to.vect</a></em>
on the resultant raster map.

<p>
<em>r.thin</em> may create small spurs or "dangling lines"
during the thinning process.  These spurs may be removed
(after creating a vector map layer) by
<em><a href="v.clean.html">v.clean</a></em> (<em>rmdangle</em>
tool).

<p>
This code implements the thinning algorithm described in
"Analysis of Thinning Algorithms Using Mathematical
Morphology" by Ben-Kwei Jang and Ronlad T. Chin in
<em>Transactions on Pattern Analysis and Machine
Intelligence</em>, vol. 12, No. 6, June 1990.  The
definition Jang and Chin give of the thinning process is
"successive removal of outer layers of pixels from an
object while retaining any pixels whose removal would alter
the connectivity or shorten the legs of the sceleton."

<p>
The sceleton is finally thinned when the thinning process
converges; i.e., "no further pixels can be removed without
altering the connectivity or shortening the sceleton legs"
(p. 541).  The authors prove that the thinning process
described always converges and produces one-pixel thick
sceletons.  The number of iterations depends on the
original thickness of the object.  Each iteration peels off
the outside pixels from the object.  Therefore, if the
object is &lt;= n pixels thick, the algorithm should
converge in &lt;= iterations.

<h2>EXAMPLE</h2>

To vectorize the raster map <em>streams_derived</em> in the North 
Carolina sample dataset that represents the stream network derived from 
the 10m resolution DEM by <em>r.watershed</em>, run:

<div class="code"><pre>
g.region raster=elevation -p
# create flow accumulation map
r.watershed elevation=elevation accumulation=accum_50K thresh=50000
# extract streams from flow accumulation map
r.mapcalc "streams_from_flow = if(abs(accum_50K) > 1000, 1, null())"

# skeletonize map
r.thin streams_from_flow out=streams_thin

d.mon wx0
d.rast streams_from_flow
d.erase
d.rast streams_thin
</pre></div>
<p>

<center>
<img src="r_thin_network.png" alt="Raster feature thinning (skeletonizing)"><br>
Raster feature thinning (skeletonizing)
</center>
<p>

The resulting map cabe optionally vectorized:
<div class="code"><pre>
r.to.vect streams_thin output=streams_thin type=line
# visualize
d.rast accum_50K
d.vect streams_thin color=red width=2
</pre></div>
<p>

<center>
<img src="r_thin_vectorized.png" alt="Vectorized stream network after thinning extracted from flow accumulation map"><br>
Vectorized stream network after thinning extracted from flow accumulation map
</center>

<!--
# compare to official NC stream map
d.erase
d.vect streams_thin color=red width=2
d.vect streams color=blue width=2
-->

<h2>SEE ALSO</h2>

<em>
<a href="g.region.html">g.region</a>,
<a href="r.to.vect.html">r.to.vect</a>,
<a href="v.clean.html">v.clean</a>,
<a href="wxGUI.vdigit.html">wxGUI vector digitizer</a>,
<a href="v.build.html">v.build</a>
</em>

<h2>AUTHOR</h2>

Olga Waupotitsch, U.S.Army Construction Engineering Research Laboratory

<p>The code for finding the bounding box as well as input/output code
was written by Mike Baba (DBA Systems, 1990) and Jean Ezell (USACERL, 1988).

<!--
<p>
<i>Last changed: $Date$</i>
-->
